package com.itheima.zhaohang.adapter;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by 赵航 on 2017/7/23.
 */

public abstract class BasicRecycleViewAdapter<T> extends RecyclerView.Adapter<BasicViewholder> {

    private List<T>                           mShowItems;
    //所有点击事件的集合
    private SparseArray<ItemClickeListener> onClickListeners;

    public BasicRecycleViewAdapter(List<T> showItems) {
        mShowItems = showItems;
        onClickListeners = new SparseArray<>();
    }


    /**
     * 这里实现三个自定义接口
     */

    public interface ItemClickeListener {
        void onItemClicked(View view, int position);
    }

    private ItemClickeListener mOnItemClickeListener;

    /**
     * 存储viewId对应的回调监听实例listener
     *
     * @param viewId               绑定的点击事件的R.id.xx
     * @param onItemClickeListener 对应该id的点击事件
     */
    public void setOnItemClickeListener(int viewId, ItemClickeListener onItemClickeListener) {
       this.mOnItemClickeListener = onClickListeners.get(viewId);
        if (mOnItemClickeListener == null) {

            //将点击事件的id和点击事件作为键值对的形式储存
            onClickListeners.put(viewId, onItemClickeListener);
        }
    }


    /**
     * 设置数据
     *
     * @param holder   viewholder
     * @param position 条目的位置
     */
    @Override
    public void onBindViewHolder(BasicViewholder holder, final int position) {
        //获取条目
        T itm = mShowItems.get(position);
        //更新视图view交由子类负责完成
        convert(holder, itm, position);
        //遍历所有绑定点击事件的id
        for (int i = 0; i < onClickListeners.size(); ++i) {
            //拿到对应的id
            int id = onClickListeners.keyAt(i);

            //            根据id获取到对应的view
            View view = holder.getView(id);

            if (view == null) {
                continue;
            }
            final ItemClickeListener listener = onClickListeners.get(id);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (listener != null) {
                        listener.onItemClicked(view, position);
                    }
                }
            });


        }
    }


    /**
     * 更新itemView视图
     *
     * @param holder   该条目的viewHolder
     * @param itm      该条目
     * @param position 该条目的位置
     */
    public abstract void convert(BasicViewholder holder, T itm, int position);


    /**
     * 返回对应条目的数量
     *
     * @return
     */
    @Override
    public int getItemCount() {
        return mShowItems == null ? 0 : mShowItems.size();
    }


    /**
     * @param parent   父布局
     * @param viewType 条目所需要展示的条目的布局R.layout.xxxml;
     * @return
     */
    @Override
    public BasicViewholder onCreateViewHolder(ViewGroup parent, int viewType) {
        //根据不同的viewType展示不同的viewHolder
        int layoutID = getSuccessFullView(viewType);
        BasicViewholder viewholder = BasicViewholder.getViewHolder(parent, layoutID);
        return viewholder;
    }

    /**
     * @param viewType 条目类型，根据条目类型来展示不同的条目R.Layout.xxxml
     * @return 根据条目类型来展示不同的条目R.Layout.xxxml
     */
    public abstract int getSuccessFullView(int viewType);


    /**
     * 条目类型数目
     *
     * @param position
     * @return
     */
    public T getItem(final int position) {
        if (mShowItems == null) {
            return null;
        }

        return mShowItems.get(position);
    }

    /**
     * 当adapter取消的时候，将所有数据复原
     */
    public void destroyAdapter() {
        if (onClickListeners != null) {
            onClickListeners.clear();
        }
        onClickListeners = null;

        if (mShowItems != null) {
            mShowItems.clear();
        }
        mShowItems = null;
    }
}
